package br.com.petsis.funcionalidades.consultarPacotes;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Cliente;
import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.FormaPagamento;
import br.com.petsis.entity.Pacote;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.Pet;
import br.com.petsis.entity.Raca;
import br.com.petsis.entity.Usuario;

@Name("consultarPacotesController")
@Scope(ScopeType.CONVERSATION)
public class ConsultarPacotesController {
	
	private static final String QRY_PACOTES = "select p from Pacote p where p.flgAtivo = 'T'";
	private static final String QRY_CLIENTES = "select c from Cliente c where c.flgAtivo = 'T' and c.empresa.idEmpresa = :idEmpresa order by c.dscNome";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Pacote> listaPacotes;
	
	private List<SelectItem> listaClientes;
	
	private List<SelectItem> listaFormasPagamento;
	
	private Pacote pacoteConsulta;
	
	@Out(required=false)
	private Pacote pacoteSelecionado;
	
	private Float valorTotal;
	
	@In(required=false)
    private Empresa empresaSessao;
	
	@In
	private Usuario usuarioLogado;
	
	public void onLoad(){
		pacoteSelecionado = null;
		setListaPacotes(null);
		setListaClientes(null);
		setPacoteConsulta(null);
		setValorTotal(null);
		if(usuarioLogado != null && usuarioLogado.getCliente() != null){
			getPacoteConsulta().setCliente(usuarioLogado.getCliente());
		}
	}
	
	public String gerarContrato(Pacote pacote){
		pacoteSelecionado = pacote;
		if(pacoteSelecionado.getPet() == null){
			pacoteSelecionado.setPet(new Pet());
			pacoteSelecionado.getPet().setRaca(new Raca());
		}
		return "contrato";
	}
	
	public void pesquisar(){
		if(empresaSessao == null){
			
		}
		
		StringBuffer query = new StringBuffer(QRY_PACOTES);
		
		if(getPacoteConsulta().getCliente().getIdCliente() != null){
			query.append(" and p.cliente.idCliente = :idCliente");
		}
		
		if(getPacoteConsulta().getDtaInicio() != null){
			query.append(" and p.dtaPagamento >= :dtaInicio");
		}
		
		if(getPacoteConsulta().getDtaFim() != null){
			query.append(" and p.dtaPagamento <= :dtaFim");
		}
		
		if(getPacoteConsulta().getFormaPagamento().getIdFormaPagamento() != null){
			query.append(" and p.formaPagamento.idFormaPagamento = :idFormaPagamento");
		}
			
		query.append(" and p.empresa.idEmpresa = :idEmpresa");
		
		query.append(" ORDER BY p.dtaPagamento DESC");
		
		Query qryResult = entityManager.createQuery(query.toString());
		
		if(getPacoteConsulta().getCliente().getIdCliente() != null){
			qryResult.setParameter("idCliente", getPacoteConsulta().getCliente().getIdCliente());
		}
		
		if(getPacoteConsulta().getDtaInicio() != null){
			qryResult.setParameter("dtaInicio", getPacoteConsulta().getDtaInicio());
		}
		
		if(getPacoteConsulta().getDtaFim() != null){
			qryResult.setParameter("dtaFim", getPacoteConsulta().getDtaFim());
		}
		
		if(getPacoteConsulta().getFormaPagamento().getIdFormaPagamento() != null){
			qryResult.setParameter("idFormaPagamento", getPacoteConsulta().getFormaPagamento().getIdFormaPagamento());
		}
		
		qryResult.setParameter("idEmpresa", empresaSessao.getIdEmpresa());
		
		listaPacotes = qryResult.getResultList();

		Float valorTotal = 0F;
		if(listaPacotes == null || listaPacotes.size() == 0){
			FacesMessages.instance().add(Severity.ERROR,"Nenhum registro encontrado.");
		}else{
			for(Pacote p : listaPacotes){
				valorTotal += p.getVlrPacote();
			}
			setValorTotal(valorTotal);
			FacesMessages.instance().add(Severity.INFO,"Foram encontrados "+listaPacotes.size()+" registros.");
		}
	}

	public List<Pacote> getListaPacotes() {
		return listaPacotes;
	}

	public void setListaPacotes(List<Pacote> listaPacotes) {
		this.listaPacotes = listaPacotes;
	}

	public List<SelectItem> getListaClientes() {
		if (listaClientes == null) {
			listaClientes = new ArrayList<SelectItem>();
			listaClientes.add(new SelectItem(null,"Selecione"));
			if(empresaSessao != null){
				List<Cliente> lista = entityManager.createQuery(QRY_CLIENTES)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				for(Cliente c : lista){
					listaClientes.add(new SelectItem(c.getIdCliente(),c.getDscNome()));
				}
			}
		}
		return listaClientes;
	}

	public void setListaClientes(List<SelectItem> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<SelectItem> getListaFormasPagamento() {
		if (listaFormasPagamento == null) {
			listaFormasPagamento = new ArrayList<SelectItem>();
			listaFormasPagamento.add(new SelectItem(null,"Todas"));
			List<FormaPagamento> lista = entityManager.createQuery("select f from FormaPagamento f where f.flgAtivo = 'T'").getResultList();
			for(FormaPagamento f : lista){
				listaFormasPagamento.add(new SelectItem(f.getIdFormaPagamento(),f.getDscFormaPagamento()));
			}
		}
		return listaFormasPagamento;
	}

	public void setListaFormasPagamento(List<SelectItem> listaFormasPagamento) {
		this.listaFormasPagamento = listaFormasPagamento;
	}

	public Pacote getPacoteConsulta() {
		if (pacoteConsulta == null) {
			pacoteConsulta = new Pacote();
			pacoteConsulta.setCliente(new Cliente());
			pacoteConsulta.setFormaPagamento(new FormaPagamento());
		}
		return pacoteConsulta;
	}

	public void setPacoteConsulta(Pacote pacoteConsulta) {
		this.pacoteConsulta = pacoteConsulta;
	}

	public Float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(Float valorTotal) {
		this.valorTotal = valorTotal;
	}
	
}
